# 数据库

from agents import function_tool, Agent, handoff, Runner
from agents.extensions.handoff_prompt import prompt_with_handoff_instructions

import study.Openai_Config as config

#
config.set_client()

order_database = {
    "ORD12345": {
        "status": "已发货",
        "date": "2025-03-05",
        "items": ["手机壳", "耳机"],
        "total": 244,
        "tracking": "SF1234567890"
    },
    "ORD67890": {
        "status": "已发货",
        "date": "2025-03-10",
        "items": ["平板电脑", "保护膜"],
        "total": 2499.2
    }
}


# 工具函数
@function_tool
def check_order_status(order_id: str) -> str:
    print(f"查询订单 {order_id}")
    if order_id in order_database:
        order = order_database[order_id]
        return f"订单 {order_id} 当前状态: {order['status']}, 下单日期: {order['date']}, 金额: {order['total']}"
    return f"未找到订单{order_id}"


@function_tool
def get_tracking_info(order_id: str) -> str:
    if order_id in order_database and order_database[order_id].get("tracking"):
        order = order_database[order_id]
        return f"订单 {order_id} 物流单号是: {order_database[order_id]["tracking"]}"
    return f"订单 {order_id} 暂无物流信息或订单不存在"


# 专业代理
# 订单查询代理
order_agent = Agent(
    name="订单查询专员",
    instructions="""
    你是电子商务平台的订单查询员。你可以帮组客户查询订单状态和物流信息。
    
    你需要获取订单号才能提供帮组。如果客户没有订单号，请礼貌地询问。
    
    请记住，你的职责只是查询和提供订单信息。如果客户提出其他需求（如退款或投诉），请向客户说明你只负责订单查询，并建议他们联系相关部门。
    """,
    tools=[check_order_status, get_tracking_info]
)
# 退款处理代理
refund_agent = Agent(
    name="退款处理专员",
    instructions="""
    你是电子商务平台的退款处理专员。
    
    处理退款请求时，请遵循以下步骤：
    1.确认订单信息和退款原因
    2.检查退款资格（例如退货时间、产品状态等）
    3.解释退款流程和预计到账时间
    
    对于不符合退款条件的情况，请清楚解释原因并提供替代解决方案。
    """,
    tools=[check_order_status]
)
# 投诉处理代理
complaint_agent = Agent(
    name="客户投诉专员",
    instructions="""
    你是电子商务平台的客户投诉专员。你的目标是理解客户的不满并寻找解决方案。
    
    请记住：
    1.首先表示同理心和理解
    2.获取所有相关信息
    3.提供明确的解决方案或后续步骤
    4.在适当的情况下提供补偿（如优惠券、积分等）
    
    对于特别严重或复杂的投诉，可以承诺由主管跟进处理。
    
    """,
    tools=[check_order_status]
)

# 设置交接 - 修改名称使其更具描述性和区分度
transfer_to_order_specialist = handoff(
    agent=order_agent,
    tool_name_override="transfer_to_order_specialist",
    tool_description_override="当客户需要查询订单状态或物流信息时使用此工具。例如'我想查询订单状态'、'我的包裹到哪儿了'等情况。"
)

transfer_to_refund_specialist = handoff(
    agent=refund_agent,
    tool_name_override="transfer_to_refund_specialist",
    tool_description_override="当客户明确要求退款或退货时使用此工具。例如'我想申请退款'、'如何退货'等情况。"
)

transfer_to_complaint_specialist = handoff(
    agent=complaint_agent,
    tool_name_override="transfer_complaint_specialist",
    tool_description_override="仅当客户明确表示不满、抱怨或投诉时使用此工具。例如'我对服务不满'、'我要投诉'等情况。"
)

# 前台接待代理 - 使用更明确的指令和例子
main_agent = Agent(
    name="客服前台",
    instructions=prompt_with_handoff_instructions("""
    你是电子商务平台的客服前台。你的工作是了解客户需求并将他们引导至合适的专业客服。请根据以下明确的指引决定如何处理客户查询：
    
    1.订单查询类问题：
      - 示例：“我想查询订单状态”、“我的包裹什么时候到”、“能告诉我订单号XXX的情况吗”
      - 操作：使用transfer_to_order_specialist工具
    
    2.退款类问题：
      - 示例：“我想申请退款”、“这个产品有问题，我要退货”、“如何办理退款”
      - 操作：使用transfer_to_refund_specialist工具
      
    3.投诉类问题：
      - 示例：“我对你们的服务很不满意”、“我要投诉”、“这个体验太糟糕了”
      - 操作： 使用transfer_to_complaint_specialist工具
    """)
)

# 设置主代理交接，按常见度排序
main_agent.handoffs = [
    transfer_to_order_specialist,
    transfer_to_refund_specialist,
    transfer_to_complaint_specialist
]


def handle_customer_query(query):
    print(f"\n====== 新的客户查询 ======")
    print(f"客户：{query}")
    result = Runner.run_sync(main_agent, query)
    print(f"\n客服回复: {result.final_output}")
    return result


def test():
    handle_customer_query("你好，我想查询一下订单状态，订单号 ORD12345")
